/**
 * Vector addition: C = A + B.
 *
 * This sample is a very basic sample that implements element by element
 * vector addition. It is the same as the sample illustrating Chapter 2
 * of the programming guide with some additions like error checking.
 */

 #include <stdio.h>

 // For the CUDA runtime routines (prefixed with "cuda_")
 #include <cuda_runtime.h>
 #include <helper_cuda.h>
 #include <cublas.h>
 

 int main(void) {
    cublasInit();
    // cublasSgemm(char transa, char transb, int m, int n, int k, 
    //     float alpha, const float * A, int lda, const float * B,
    //      int ldb, float beta, float * C, int ldc);

    // 创建 cuBLAS 句柄
    // cublasHandle_t handle;
    // cublasCreate(&handle);

    // // 定义矩阵维度和大小
    // int m = 3; // 行数
    // int n = 2; // 列数
    // int k = 4; // 中间维度
    // int lda = m;
    // int ldb = k;
    // int ldc = m;
    
    // // 分配和初始化主机端矩阵 A、B 和 C
    // float *h_A = (float *)malloc(m * k * sizeof(float));
    // float *h_B = (float *)malloc(k * n * sizeof(float));
    // float *h_C = (float *)malloc(m * n * sizeof(float));

    // // 初始化矩阵 A 和 B，这里使用示例数据填充矩阵
    // for (int i = 0; i < m * k; i++) {
    //     h_A[i] = 1.0f;
    // }
    // for (int i = 0; i < k * n; i++) {
    //     h_B[i] = 2.0f;
    // }

    // // 在 GPU 上分配设备端矩阵 A、B 和 C
    // float *d_A, *d_B, *d_C;
    // cudaMalloc(&d_A, m * k * sizeof(float));
    // cudaMalloc(&d_B, k * n * sizeof(float));
    // cudaMalloc(&d_C, m * n * sizeof(float));

    // // 将主机端矩阵复制到设备端
    // cudaMemcpy(d_A, h_A, m * k * sizeof(float), cudaMemcpyHostToDevice);
    // cudaMemcpy(d_B, h_B, k * n * sizeof(float), cudaMemcpyHostToDevice);

    // // 执行矩阵乘法操作：C = alpha * A * B + beta * C，这里设置 alpha 和 beta 为 1.0
    // float alpha = 1.0f;
    // float beta = 1.0f;
    // cublasSgemm(handle, CUBLAS_OP_N, CUBLAS_OP_N, m, n, k, &alpha, d_A, lda, d_B, ldb, &beta, d_C, ldc);

    // // 将结果从设备端复制回主机端
    // cudaMemcpy(h_C, d_C, m * n * sizeof(float), cudaMemcpyDeviceToHost);

    // // 打印结果矩阵 C
    // printf("Result matrix C:\n");
    // for (int i = 0; i < m; i++) {
    //     for (int j = 0; j < n; j++) {
    //         printf("%f ", h_C[i * n + j]);
    //     }
    //     printf("\n");
    // }

    // // 释放内存和 cuBLAS 句柄
    // free(h_A);
    // free(h_B);
    // free(h_C);
    // cudaFree(d_A);
    // cudaFree(d_B);
    // cudaFree(d_C);
    // cublasDestroy(handle);

    return 0;
 }
 